package com.z.redis.command.impl.hash;

import com.z.redis.RedisCore;
import com.z.redis.command.Command;
import com.z.redis.command.CommandType;
import com.z.redis.datatype.BytesWrapper;
import com.z.redis.datatype.RedisData;
import com.z.redis.datatype.RedisHash;
import com.z.redis.resp.BulkString;
import com.z.redis.resp.Resp;
import com.z.redis.resp.RespInt;
import com.z.redis.resp.SimpleString;
import io.netty.channel.ChannelHandlerContext;

/**
 * hlen key
 * 获取哈希表的字段数
 */
public class Hlen implements Command {
    private BytesWrapper key;

    @Override
    public CommandType type(){
        return CommandType.hlen;
    }

    @Override
    public void setContent(Resp[] array){
        key = ((BulkString) array[1]).getContent();
    }

    @Override
    public void handle(ChannelHandlerContext ctx, RedisCore redisCore){
        RedisData redisData = redisCore.get(key);
        if(redisData == null) {  // 如果不存在返回0
            ctx.writeAndFlush(new RespInt(0));
        }else if(redisData instanceof RedisHash){
            int len = ((RedisHash) redisData).size();
            ctx.writeAndFlush(new RespInt(len));
        }else {
            // 不是哈希类型
            ctx.writeAndFlush(new SimpleString("error: not hash type"));
        }
    }
}
